package com.greentreecs.fms.util;

import com.greentreecs.fms.pojo.domain.AccountingRecDO;
import com.greentreecs.fms.pojo.domain.FeeGenerateDO;
import com.greentreecs.fms.pojo.domain.IncGenerateDO;
import com.greentreecs.fms.pojo.domain.OutcGenerateDO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @author 刀氏春秋
 * @date 2023/12/1
 */
public class TableQueryUtil {
    private final static Logger logger = LoggerFactory.getLogger(TableQueryUtil.class);

    /**
     * 查询收入记录是否存在于收支表中
     *
     * @param feeGenes 收支表
     * @param incRec   收入记录
     * @return 是否存在
     */
    public static boolean isIncRecExistInFeeGenesTable(List<FeeGenerateDO> feeGenes, IncGenerateDO incRec) {
        // 逐个遍历费用发生表内的记录
        for (FeeGenerateDO feeRec : feeGenes) {
            if (!(feeRec.getAccountNo() == null || feeRec.getGuestName() == null
                    || feeRec.getType() == null || feeRec.getBill() == null)
                    && (feeRec.getAccountNo().equals(incRec.getAccountNo()))) {
                // 如果两个都相等，说明是存在这条记录的
                if (feeRec.isMatchWith(incRec)) {
                    return true;
                }
            }
        }
        logger.warn("发现与任何收支记录均不匹配的收入记录:{}", incRec);
        return false;
    }

    /**
     * 三个条件判断，账户A开头，没有房号，没有户号
     *
     * @param feeRec 收支记录
     * @return 是否为预付款记录
     */
    public static boolean isNormalRecord(AccountingRecDO feeRec) {
        return (feeRec.getType() != null && feeRec.getTime() != null) // 1，科目和时间不能为空
                && (feeRec.getGuestName() != null || feeRec.getRoomNo() != null) // 2，姓名和房号至少有一个
                && (feeRec.getAccountNo() != null && !feeRec.getAccountNo().startsWith("A")); // 3，账户不为空且不以A起始
    }

    public static boolean isOutcRecExistInFeeGenesTable(List<FeeGenerateDO> feeGenes, OutcGenerateDO outcRec) {
        for (FeeGenerateDO feeRec : feeGenes) {
            // 对于美团携程等客户，跳过合并，其将单独核对
            if (isNormalRecord(feeRec)) {
//                try {
//                    Matcher matcher = Pattern.compile("\\[(.*?)\\]").matcher(outcRec.getComments());
//                    logger.info("备注匹配结果: 源={}，匹配={}",
//                            outcRec.getComments(), matcher.group(2)
//                    );
//                } catch (IllegalStateException e) {
//                    logger.info("备注匹配失败: 源={}，信息: {}", outcRec.getComments(), e.getMessage());
//                }
                if (feeRec.isMatchWith(outcRec)) {
                    return true;
                }
            }
            // 如果是常规情况，则按照账号、姓名、房号等匹配即可
        }
        return false;
    }
}
